/**
 *
 */
validate = {
	showErrors: function(errors) { // Отобржает набор ошибок из ассоциативного массива
		var errText = '';
		for(var name in errors) {
			var $input = $('#Booking_' + name);
			if ($input.length) this.showError($input, errors[name]);
			else errText += errors[name] + "\n";
		}
		if (errText) App.error(errText);
	},
	showError: function($input, message) { // Отображает ошибку рядом с полем
		if ($input.is(':visible')) var $elem = $input;
		else {
			if ($input.is('select')) var $elem = $input.next();
			else var $elem = $input.prev();
		}
		$('<div class=\"inputError\" data-input-id="' + $input.attr('id') + '">' + message + '</div>').prependTo('body')
		.css({'z-index':2, left:$elem.offset().left + $elem.width() + 20, top:$elem.offset().top + 8});		
	},
	validateCard: function(cn) { // Проверяет кредитную карту на валидность
	  var odd = new Array();
		var even = new Array();
	  for(var x in cn) {
	    if(x % 2 == 0) odd.push(cn[x]);
	    else even.push(cn[x]);
		}
		
	  for(var x in odd) {
	  	var tmp = odd[x] * 2;
	    if(tmp <= 9) odd[x] = tmp;
	    else {
	      var s = String(tmp);
	      odd[x] = (s[0] - 0) + (s[1] - 0);
	    }
		}
		var summa = 0;
		for(var x in odd) {
			summa += odd[x];
		}
		for(var x in even) {
			summa += even[x] - 0;
		}
		if (summa % 10 == 0) return true;
		else return false;		
	}
};

jQuery.fn.validate = function() {
	$('.inputError').remove();
	var validated = true;
	var elems = $(this).find('input, select').add(this).filter('input, select');
	elems.bind('focus change', function() {
		var id = $(this).attr('id');
		$('.inputError[data-input-id=' + id + ']').fadeOut();
	});
	elems.each(function() {
		var message = null;
		var $input = $(this);
		var value = $input.val();
		if ($input.hasClass('vRequired')) {
			if (!value) {
				message = 'Поле должно быть заполнено';
			}
		}
		if ($input.hasClass('vName')) {
			if (value.length < 1 || value.length > 25) {
				message = 'Длина поля должна быть от 1 до 25 символов';
			}
		}
		if ($input.hasClass('vFullName')) {
			if (value.length < 3 || value.length > 50) {
				message = 'Длина поля должна быть от 3 до 50 символов';
			}
		}
		if ($input.hasClass('vPhone')) {
			if (value.length < 8 || value.length > 24) {
				message = 'Длина поля должна быть от 8 до 24 символа';
			}
		}
		if ($input.hasClass('vEMail')) {
			if (value.length < 1 || value.length > 50) {
				message = 'Длина поля должна быть от 1 до 50 символов';
			}
			if (!(/^[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?\.[A-Za-z0-9]{2,6}$/gi).test(value)) {
				message = 'E-Mail введен неверно';
			}
		}
		if ($input.hasClass('vExpirity')) {
			if (value.length != 5) {
				message = 'Длина поля должна быть 5 символов';
			}
			if (!(/^[\d]{2}\/[\d]{2}$/gi).test(value)) {
				message = 'Поле должно иметь формат 00/00';
			}
			else {
				var arrValue = value.split('/');
				if (parseInt(arrValue[0]) > 12) {
					message = 'Неверно указан месяц';
				}
				if (parseInt(arrValue[1]) < 12 || parseInt(arrValue[1]) > 30) {
					message = 'Неверно указан год';
				}
			}
		}
		if ($input.hasClass('vCvc')) {
			if (value.length < 3 || value.length > 4) {
				message = 'Длина поля должна быть 3-4 символа';
			}
			if (!(/^[\d]{3,4}$/gi).test(value)) {
				message = 'В поле должны быть 3-4 цифры';
			}
		}
		if ($input.hasClass('vCreditCard')) {
			if (!(/^[\d]{16}$/gi).test(value)) {
				message = 'В поле должны быть 16 цифр';
			}
			if (!validate.validateCard($(this).val())) {
				message = 'Неверный номер карты';
			}
		}
		if (message) {
			validated = false;
			// Показываем ошибку
			validate.showError($input, message);
		}
	});
	return validated;
};